use core::registry::PackageRegistry;
use core::{Source, SourceId, PackageSet, Package, Target};
-use core::{Profile, TargetKind, Profiles, Workspace};
+use core::{Profile, TargetKind, Profiles, Workspace, PackageIdSpec};
use core::resolver::{Method, Resolve};
use ops::{self, BuildOutput, ExecEngine};
use sources::PathSource;
source: Option<Box<Source + 'a>>,
features: Vec<String>,
all_features: bool,
- no_default_features: bool)
+ no_default_features: bool,
+ spec: &'a [String])
-> CargoResult<(PackageSet<'a>, Resolve)> {
let mut registry = try!(PackageRegistry::new(ws.config()));
}
};
+ let specs = try!(spec.iter().map(|p| PackageIdSpec::parse(p))
+ .collect::<CargoResult<Vec<_>>>());
+
let resolved_with_overrides =
try!(ops::resolve_with_previous(&mut registry, ws,
- method, Some(&resolve), None));
+ method, Some(&resolve), None,
+ &specs));
let packages = ops::get_resolved_packages(&resolved_with_overrides,
registry);
try!(generate_targets(root_package, profiles, mode, filter, release));
}
- let (packages, resolve_with_overrides) = {
- try!(resolve_dependencies(ws, source, features, all_features, no_default_features))
- };
+ let (packages, resolve_with_overrides) =
+ try!(resolve_dependencies(ws, source, features, all_features, no_default_features, spec));
let mut pkgids = Vec::new();
if spec.len() > 0 {
let mut registry = try!(PackageRegistry::new(ws.config()));
let resolve = try!(ops::resolve_with_previous(&mut registry, ws,
Method::Everything,
- None, None));
+ None, None, &[]));
try!(ops::write_pkg_lockfile(ws, &resolve));
Ok(())
}
ws,
Method::Everything,
Some(&previous_resolve),
- Some(&to_avoid)));
+ Some(&to_avoid),
+ &[]));
// Summarize what is changing for the user.
let print_change = |status: &str, msg: String| {
None,
opt.features.clone(),
opt.all_features,
- opt.no_default_features));
+ opt.no_default_features,
+ &[]));
let (packages, resolve) = deps;
let packages = try!(packages.package_ids()
use std::collections::{HashMap, HashSet};
-use core::{PackageId, SourceId, Workspace};
+use core::{PackageId, PackageIdSpec, SourceId, Workspace};
use core::registry::PackageRegistry;
use core::resolver::{self, Resolve, Method};
use ops;
let prev = try!(ops::load_pkg_lockfile(ws));
let resolve = try!(resolve_with_previous(registry, ws,
Method::Everything,
- prev.as_ref(), None));
+ prev.as_ref(), None, &[]));
// Avoid writing a lockfile if we are `cargo install`ing a non local package.
if ws.current_opt().map(|pkg| pkg.package_id().source_id().is_path()).unwrap_or(true) {
ws: &Workspace,
method: Method,
previous: Option<&'a Resolve>,
- to_avoid: Option<&HashSet<&'a PackageId>>)
+ to_avoid: Option<&HashSet<&'a PackageId>>,
+ specs: &[PackageIdSpec])
-> CargoResult<Resolve> {
// Here we place an artificial limitation that all non-registry sources
// cannot be locked at more than one revision. This means that if a git
if let Method::Required { .. } = method {
assert!(previous.is_some());
if let Some(current) = ws.current_opt() {
- if member.package_id() != current.package_id() {
+ if member.package_id() != current.package_id() &&
+ !specs.iter().any(|spec| spec.matches(member.package_id())) {
continue;
}
}
error: you can't generate a lockfile for an empty workspace.
"));
}
+
+#[test]
+fn workspace_with_transitive_dev_deps() {
+ let p = project("foo")
+ .file("Cargo.toml", r#"
+ [project]
+ name = "foo"
+ version = "0.5.0"
+ authors = ["mbrubeck@example.com"]
+
+ [dependencies.bar]
+ path = "bar"
+
+ [workspace]
+ "#)
+ .file("src/main.rs", r#"fn main() {}"#)
+ .file("bar/Cargo.toml", r#"
+ [project]
+ name = "bar"
+ version = "0.5.0"
+ authors = ["mbrubeck@example.com"]
+
+ [dev-dependencies.baz]
+ path = "../baz"
+ "#)
+ .file("bar/src/lib.rs", r#"
+ pub fn init() {}
+
+ #[cfg(test)]
+
+ #[test]
+ fn test() {
+ extern crate baz;
+ baz::do_stuff();
+ }
+ "#)
+ .file("baz/Cargo.toml", r#"
+ [project]
+ name = "baz"
+ version = "0.5.0"
+ authors = ["mbrubeck@example.com"]
+ "#)
+ .file("baz/src/lib.rs", r#"pub fn do_stuff() {}"#);
+ p.build();
+
+ assert_that(p.cargo("test").args(&["-p", "bar"]),
+ execs().with_status(0));
+}